// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_PLAYBACK_RECORDING_SOURCE_H_
#define CC_PLAYBACK_RECORDING_SOURCE_H_

#include <stddef.h>

#include <memory>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "cc/base/cc_export.h"
#include "cc/base/invalidation_region.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"

namespace cc {

class DisplayItemList;
class RasterSource;
class Region;

class CC_EXPORT RecordingSource {
public:
    enum RecordingMode {
        RECORD_NORMALLY,
        RECORD_WITH_PAINTING_DISABLED,
        RECORD_WITH_CACHING_DISABLED,
        RECORD_WITH_CONSTRUCTION_DISABLED,
        RECORD_WITH_SUBSEQUENCE_CACHING_DISABLED,
        RECORD_WITH_PARTIAL_INVALIDATION,
        RECORDING_MODE_COUNT, // Must be the last entry.
    };

    RecordingSource();
    virtual ~RecordingSource();

    bool UpdateAndExpandInvalidation(Region* invalidation,
        const gfx::Size& layer_size,
        const gfx::Rect& new_recorded_viewport);
    void UpdateDisplayItemList(const scoped_refptr<DisplayItemList>& display_list,
        const size_t& painter_reported_memory_usage);
    gfx::Size GetSize() const;
    void SetEmptyBounds();
    void SetSlowdownRasterScaleFactor(int factor);
    void SetGenerateDiscardableImagesMetadata(bool generate_metadata);
    void SetBackgroundColor(SkColor background_color);
    void SetRequiresClear(bool requires_clear);

    void SetNeedsDisplayRect(const gfx::Rect& layer_rect);

    // These functions are virtual for testing.
    virtual scoped_refptr<RasterSource> CreateRasterSource(
        bool can_use_lcd_text) const;

    const DisplayItemList* GetDisplayItemList();
    gfx::Rect recorded_viewport() const { return recorded_viewport_; }

protected:
    gfx::Rect recorded_viewport_;
    gfx::Size size_;
    int slow_down_raster_scale_factor_for_debug_;
    bool generate_discardable_images_metadata_;
    bool requires_clear_;
    bool is_solid_color_;
    bool clear_canvas_with_debug_color_;
    SkColor solid_color_;
    SkColor background_color_;
    scoped_refptr<DisplayItemList> display_list_;
    size_t painter_reported_memory_usage_;

private:
    void UpdateInvalidationForNewViewport(const gfx::Rect& old_recorded_viewport,
        const gfx::Rect& new_recorded_viewport,
        Region* invalidation);

    void FinishDisplayItemListUpdate();

    friend class RasterSource;

    void DetermineIfSolidColor();

    InvalidationRegion invalidation_;

    DISALLOW_COPY_AND_ASSIGN(RecordingSource);
};

} // namespace cc

#endif // CC_PLAYBACK_RECORDING_SOURCE_H_
